#ifndef MODULEFILECONFIG_H
#define MODULEFILECONFIG_H

#include <QWidget>
#include <QFile>
#include <QDomElement>

struct PortAttribute
{
    QString name;
    QString id;
    QString type;
};

struct ModuleAttribute
{
    QString module_name;
    QString module_type;
    QString module_class;
};

struct ModulePorts {
    QList<PortAttribute> Input_List;
    QList<PortAttribute> Output_List;
    QList<PortAttribute> InOut_List;

    void set_Input(PortAttribute input)
    { Input_List.append(input); }

    void set_Output(PortAttribute output)
    { Output_List.append(output); }

    void set_InOut(PortAttribute inout)
    { InOut_List.append(inout); }
};

struct Module_Data
{
    ModuleAttribute module_attribute;
    ModulePorts ports;

    QString Module_Code;

    ///---------------------------------------------------------------
    /// 获取数据

    int get_input()
    { return ports.Input_List.length(); }

    int get_output()
    { return ports.Output_List.length(); }

    int get_inout()
    { return ports.InOut_List.length(); }

    int sum_portNumber()
    { return get_input() + get_output() + get_inout(); }

    QString get_module_name()
    { return module_attribute.module_name; }

    QString get_module_type()
    { return module_attribute.module_type; }

    QString get_module_class()
    { return module_attribute.module_class; }

    ///---------------------------------------------------------------
    /// 写入数据

    void set_input(PortAttribute pa)
    { ports.set_Input(pa); }

    void set_output(PortAttribute pa)
    { ports.set_Output(pa); }

    void set_inout(PortAttribute pa)
    { ports.set_InOut(pa); }

    void set_module_name(QString name)
    { module_attribute.module_name = name; }

    ///---------------------------------------------------------------
};

#define MODULE_END_FORMAT ".module"
#define MODULE_DIRECTORY_NAME "/module/"

class moduleFileConfig : public QWidget
{
    Q_OBJECT
public:
    explicit moduleFileConfig(QWidget *parent = nullptr);

    static QString makeMD5(QString content);
    static QString makeID();  // 通过MD5(QRandomGenerator随机数 + 当前系统时间)计算所得ID

    void init_Module_Data(QString file_path);

    Module_Data get_module_data();

    QString get_module_name();

signals:

public slots:
    void recv_newModule(QString, Module_Data);

private:
    Module_Data Data;
    QString file_path;

    void create_moduleFile(QString path, Module_Data);
    void init_moduleFile(QFile *fp, Module_Data);

    void check_moduleDictory(QString path);

};

#endif // MODULEFILECONFIG_H
